package metier;

import java.awt.Color;
import java.util.ArrayList;

import utiles.FourmizLogger;
import utiles.K;

/**
 * Classe représentant une fourmilière
 *
 * @author Thomas Folgueral
 * @author Julien Pernot
 * @author Guillaume Peyet
 * @author Guillaume Sainthillier
 */
public class Fourmiliere extends Element {

    private ArrayList<Fourmi> fourmis;
    private int quantiteNourritureStockee;
    private int baseNbFourmi;
    private Reine reine;

	public Fourmiliere(int quantiteNourritureStockee) {
        this(1, 2, quantiteNourritureStockee);
    }

    public Fourmiliere(int longueur, int largeur, int quantiteNourritureStockee) {
        super(longueur, largeur);

        this.fourmis = new ArrayList();
        this.quantiteNourritureStockee = quantiteNourritureStockee;
        
        this.couleur = Color.CYAN;
    }

    /**
     * Ajoute une fourmi à la fourmilière
     * @param f la fourmi à ajouter
     * @return true si la fourmi a bien été ajoutée, false sinon
     */
    public boolean addFourmi(Fourmi f) {
    	if (f instanceof Reine) {
    		this.reine = (Reine) f;
    		return true;
    	}
    	
    	return this.fourmis.add(f);
    }

    /**
     * Supprime une fourmi de la fourmilière
     * @param f la fourmi à supprimer
     * @return true si la fourmi a bien été supprimée, false sinon
     */
    public boolean removeFourmi(Fourmi f) {
        return this.fourmis.remove(f);
    }
    
    /*
        Getters and Setters
    */
    public ArrayList<Fourmi> getFourmis() {
        return fourmis;
    }

    public void setFourmis(ArrayList<Fourmi> fourmis) {
        this.fourmis = fourmis;
    }

    public int getQuantiteNourritureStockee() {
        return quantiteNourritureStockee;
    }

    public void setQuantiteNourritureStockee(int quantiteNourritureStockee) {
        this.quantiteNourritureStockee = quantiteNourritureStockee;
    }
    
    public int getBaseNbFourmi() {
		return baseNbFourmi;
	}

	public void setBaseNbFourmi(int baseNbFourmi) {
		this.baseNbFourmi = baseNbFourmi;
	}
    
    @Override
    public String toString() {
        return "F";
    }

	public void deposerNourriture(int quantiteNourritureRecoltee) {
		this.quantiteNourritureStockee += quantiteNourritureRecoltee;
	}
	
	@Override
	public void agir(Carte c) {
		int nbFourmis = this.fourmis.size();
		this.quantiteNourritureStockee -= nbFourmis;
		
		if (this.quantiteNourritureStockee <= 0) {
			for (Fourmi fourmi : this.fourmis) {
				fourmi.meurtFaim();
				c.removeElement(fourmi);
			}
			
			c.removeElement(this);
		} else {
			if (this.fourmis.size() >= K.TAILLE_LIMITE_FOURMILIERE && c.getNbFourmiliere() < K.MAX_NB_FOUMILIERE) {
				FourmizLogger.info(this, "Création d'une fourmilière");
				
				// On détermine la position de la nouvelle foumilière
				Position currentPosition = c.getPosition(this);
				int x = currentPosition.getX();
				int y = currentPosition.getY();
				Position position = null;
				
				int rayon = K.RAYON_NEW_FOURMIL;
				
				while (position == null || rayon == 0) {
					ArrayList<Position> listePos = new ArrayList<Position>();
					listePos.add(new Position (x - rayon, y - rayon));
					listePos.add(new Position (x - rayon, y));
					listePos.add(new Position (x - rayon, y + rayon));
					listePos.add(new Position (x, y - rayon));
					listePos.add(new Position (x, y + rayon));
					listePos.add(new Position (x + rayon, y - rayon));
					listePos.add(new Position (x + rayon, y));
					listePos.add(new Position (x + rayon, y + rayon));
					
					for (Position temp : listePos) {
						boolean valid = true;
						
						if (c.getElements(temp).size() == 0)
							valid = false;
						
						for (Element element : c.getElements(temp)) {
							if (element instanceof Roche)
								valid = false;
							
							if (element instanceof Fourmiliere)
								valid = false;
							
							if (element instanceof Nouriturre)
								valid = false;
						}
						
						if (valid) {
							position = temp;
							continue;
						}
					}
					
					rayon--;
				}
				
				if (position != null) {
					// Création de la nouvelle fourmilière
					Fourmiliere f = new Fourmiliere(K.QUANTITE_NOURRITURE_INITIALE);
					f.setBaseNbFourmi(this.baseNbFourmi);
					c.addElement(f, position);
					c.addElement(new Reine(position, f), position);
					c.addElement(f, position);
					
					// on ajoute les fourmis de base
					for (int i = 0; i < this.baseNbFourmi ; i++) {
						int last_index = this.fourmis.size() - 1;
						
						if (last_index >= 0) {
							f.addFourmi(this.fourmis.get(last_index));
							this.fourmis.remove(last_index);
						}
					}
				}				
			}
		}
	}
}
